package com.zkk.qqclient.service;

import com.zkk.qqcommon.Message;
import com.zkk.qqcommon.MessageType;
import com.zkk.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 该类完成用户登录验证和用户注册等功能
 * */
public class UserClientService {

    //因为我们可能在其他地方使用到user信息，因此做为成员属性
    private User u = new User();
    //因为Socket在其他地方也可能使用，因此做出属性
    private Socket socket;

    //根据userID 和 pwd 到服务器验证该用户是否合法
    public boolean checkUser(String userId,String pwd){
        boolean b = false;
        //创建User对象
        u.setUserId(userId);
        u.setPasswd(pwd);

        //连接到服务器，发送u对象
        try {
            socket = new Socket(InetAddress.getLocalHost(),9999);
            //得到ObjectOutputStream对象
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(u);//发送User对象到Socket管道

            //读取服务器回复的Message对象
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message ms = (Message) ois.readObject();

            if (ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)){

                //创建一个和服务器保持通信的线程 --> 创建一个类 ClientConnectServerThread
                ClientConnectServerThread ccst = new ClientConnectServerThread(socket);
                ccst.start();
                //为了客户端扩展性，将线程放入集合中进行管理
                ManageClientConnectServerThread.addClientConnectServerThread(userId,ccst);
                b = true;

            }else {
                //如果登录失败，我们就不能启动和服务器通信的线程，关闭Socket
                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return b;
    }

    //向服务器请求在线用户列表
    public void onlineFriendList(){

        //发送一个Message,类型为MessageType.MESSAGE_GET_ONLINE_FRIEND
        Message message = new Message();
        message.setSender(u.getUserId());
        message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        //发送给服务器
        //应当得到当前线程的Socket 对应的 ObjectOutPutStream 对象
        try {
            ObjectOutputStream oos = new ObjectOutputStream
                    (ManageClientConnectServerThread.getClientConnectServerThread(u.getUserId()).getSocket().getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //退出客户端，并给服务器发送一个退出系统的Message对象
    public void logout(){
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setSender(u.getUserId());//指定客户端Id
        //发送message
        try {
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
            System.out.println(u.getUserId() + "退出系统");
            System.exit(0); //结束客户端进程
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
